package proyectoFC_2_3_3.koyicabuto;

import proyectoFC_2_3_3.koyicabuto.BaseDeDatos.GruposDataBase;
import proyectoFC_2_3_3.koyicabuto.funciones.Funciones;
import proyectoFC_2_3_3.koyicabuto.funciones.FuncionesBaseDatos;
import proyectoFC_2_3_3.koyicabuto.services.MyLocationService;
import proyectoFC_2_3_3.koyicabuto.services.MyNotificationService;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class ListaGruposActivity extends ListActivity{
	
	private ListView listaGrupos;
	private LocationManager locManager = null;
	private LocationListener locListener = null;
	
	private FuncionesBaseDatos funcionesBaseDatos = new FuncionesBaseDatos();
	
	private Cursor cursor = null;
	
	private Funciones funciones = new Funciones();
	
	private GruposDataBase gruposDataBaseHelper = null;
	private SQLiteDatabase gruposDataBase = null;
	
	public void onCreate(Bundle savedInstance) {
		super.onCreate(savedInstance);
		setContentView(R.layout.listagrupos);
		
		//Arrancamos MyLocationService
        doBindService();
        //Arrancamos MyNotificacionService
        doBindServiceNotification();
		
		listaGrupos = this.getListView();
		listaGrupos.setTextFilterEnabled(true);
		
		gruposDataBaseHelper = new GruposDataBase(this, "GruposDataBase", null, 1);
		gruposDataBase = gruposDataBaseHelper.getReadableDatabase();		
		
		String[] campos = new String[]{"_id", "GR_NOMBRE", "GR_DESCRIPCION"};
		
		if(gruposDataBase != null){
			
			cursor = gruposDataBase.query("GRUPOS", campos, null, null, null, null, null);
				        
			startManagingCursor(cursor);
			ListAdapter adapter = new CustomCursorAdapterGrupos(this, cursor, this);
			listaGrupos = this.getListView();
			listaGrupos.setAdapter(adapter);
		}
		
		comenzarLocalizacion();
	}
	
	public void onClickBotonNuevoGrupo(View view){
		Intent intent = new Intent(this, NuevoGrupoActivity.class);
		startActivity(intent);
	}
	
	private void comenzarLocalizacion(){
        //Obtenemos una referencia al LocationManager
        locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                
        //Obtenemos la última posición conocida
        Location loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
     
        //Nos registramos para recibir actualizaciones de la posición
        locListener = new LocationListener() {
        	
	    	public void onLocationChanged(Location location) {
	    		mostrarPosicion(location);
	    	}
        	 
    	    public void onProviderDisabled(String provider){
    	        System.out.println("Provider OFF");
    	    }
    	 
    	    public void onProviderEnabled(String provider){
    	    	System.out.println("Provider ON");
    	    }
    	 
    	    public void onStatusChanged(String provider, int status, Bundle extras){
    	    	System.out.println("Provider Status = " + status);
    	    }
        };
        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 15000, 0, locListener);
    }
	 
	private void mostrarPosicion(Location loc) {
	    if(loc != null)
	    {
	        Log.i("LocAndroid", "Latitud: " + String.valueOf(loc.getLatitude()) + " - " +
	        	  "Longitud: " + String.valueOf(loc.getLongitude()));
	    }
	    else
	    {
	        System.out.println("Latitud: (sin_datos)");
	        System.out.println("Longitud: (sin_datos)");
	        System.out.println("Precision: (sin_datos)");
	    }
	}
	
	/**
     * Metodo con el que establecemos la conexión con MyLocationService
     */
	public void doBindService() {
		//De ésta forma llamamos al WebService pero no está asociado el tiempo de vida del Activity,
		//corre en un hilo diferente en la aplicacion
		ComponentName myService = startService(new Intent(this, MyLocationService.class)) ;
		
		//De esta forma de abajo llamamos al WebService, pero lo dejamos unido al tiempo de vida de ésta Activity, si muere la Activity
		//muere el Web Service.
//		bindService(new Intent(this, MyLocationService.class), mConnection, Context.BIND_AUTO_CREATE);
	}
	
	/**
     * Metodo con el que establecemos la conexión con MyNotificationService
     */
	public void doBindServiceNotification() {
		//De ésta forma llamamos al WebService pero no está asociado el tiempo de vida del Activity,
		//corre en un hilo diferente en la aplicacion
		ComponentName myNotificationService = startService(new Intent(this, MyNotificationService.class)) ;
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		
		gruposDataBase.close();
		
		//Paramos los services necesarios en el onDestroy de la Activity principal
		stopService(new Intent(this, MyLocationService.class));
		stopService(new Intent(this, MyNotificationService.class));
		Log.i(getClass().getSimpleName(), "FInish");
		
		//Terminamos la aplicacion
		finish();
	}
	
	public void eliminaGrupo(Long idGrupo, String nombreGrupo){
		crearDialogoAlerta(null, "¿Está seguro de eliminar el grupo: " + nombreGrupo + ", " +
								 "se eliminarán todos los contactos y eventos asociados al mismo.", idGrupo);		
	}
	
	private void crearDialogoAlerta(String titulo, String mensaje, final Long idGrupo){
	    AlertDialog alertDialog = new AlertDialog.Builder(this).create();
	    
	    if(titulo != null){
	    	alertDialog.setTitle(titulo);
	    }
	    alertDialog.setMessage(mensaje);
	    alertDialog.setButton("Cancelar", new OnClickListener() {
	        public void onClick(DialogInterface dialog, int which) {
	        }
	    });
	    alertDialog.setButton2("Eliminar", new OnClickListener() {
	        public void onClick(DialogInterface dialog, int which) {
	        	eliminaEventoBaseDatos(idGrupo);
	        	eliminaContactosGrupoBaseDatos(idGrupo);
	        	eliminaGrupoBaseDatos(idGrupo);
	        	
	        	updateData();
	        	
	        	Toast.makeText(ListaGruposActivity.this, "Eliminado correctamente.", Toast.LENGTH_SHORT).show();
        	}
	    });
	    alertDialog.show();	 
	}
	
	public void eliminaEventoBaseDatos(Long idGrupo){
		SQLiteDatabase gruposDataBase = funcionesBaseDatos.conectaWritableBaseDeDatos(this);		
		
		try{
			if(gruposDataBase != null){
				gruposDataBase.execSQL("DELETE FROM EVENTOS WHERE EV_GR_ID = " + idGrupo );
				
				funcionesBaseDatos.cierraBaseDeDatos(gruposDataBase);
			}
		}catch (Exception e) {
			System.out.println("Excepcion en eliminaEventoBaseDatos: " +e.getMessage());
		}
	}
	
	public void eliminaContactosGrupoBaseDatos(Long idGrupo){
		SQLiteDatabase gruposDataBase = funcionesBaseDatos.conectaWritableBaseDeDatos(this);		
		
		try{
			if(gruposDataBase != null){
				gruposDataBase.execSQL("DELETE FROM PERSONAL_GRUPOS WHERE PG_GR_ID = " + idGrupo );
				
				funcionesBaseDatos.cierraBaseDeDatos(gruposDataBase);
			}
		}catch (Exception e) {
			System.out.println("Excepcion en eliminaContactosGrupoBaseDatos: " +e.getMessage());
		}
	}
	
	public void eliminaGrupoBaseDatos(Long idGrupo){
		SQLiteDatabase gruposDataBase = funcionesBaseDatos.conectaWritableBaseDeDatos(this);		
		
		try{
			if(gruposDataBase != null){
				gruposDataBase.execSQL("DELETE FROM GRUPOS WHERE _id = " + idGrupo );
				
				funcionesBaseDatos.cierraBaseDeDatos(gruposDataBase);
			}
		}catch (Exception e) {
			System.out.println("Excepcion en eliminaGrupoBaseDatos: " +e.getMessage());
		}
	}
	
	/**
	 * Metodo que recarga la lista, para que cuando volvamos de la pantalla de añadir contactos, se carguen los contactos nuevos.
	 */
	private void updateData() {
		listaGrupos = this.getListView();
		listaGrupos.setTextFilterEnabled(true);
		
		gruposDataBaseHelper = new GruposDataBase(this, "GruposDataBase", null, 1);
		gruposDataBase = gruposDataBaseHelper.getReadableDatabase();		
		
		String[] campos = new String[]{"_id", "GR_NOMBRE", "GR_DESCRIPCION"};
		
		if(gruposDataBase != null){
			
			cursor = gruposDataBase.query("GRUPOS", campos, null, null, null, null, null);
				        
			startManagingCursor(cursor);
			ListAdapter adapter = new CustomCursorAdapterGrupos(this, cursor, this);
			listaGrupos = this.getListView();
			listaGrupos.setAdapter(adapter);
		}
	}
}
